package com.example.logisticsingle.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Redis工具类
 * @author Roskin
 *
 */
@Component
public final class RedisUtils {
	private static RedisTemplate<String, Object> redisTemplate;
	
	@Autowired
    public void setRedisTemplate(RedisTemplate<String,Object> redisTemplate) {
		RedisUtils.redisTemplate = redisTemplate;
    }
	/**
	 * 	指定缓存失效时间
	 * @param key 缓存的Key
	 * @param time	超时时间，单位为秒
	 */
	public static void expire(String key, long time) {
		if(time>0) {
			redisTemplate.expire(key, time, TimeUnit.SECONDS);
		}
	}
	/**
	 * 	根据key 获取过期时间
	 * @param key	不能为null
	 * @return	返回0代表为永久有效
	 */
	public static long getExpire(String key) {
		return redisTemplate.getExpire(key, TimeUnit.SECONDS);
	}
	/**
	 * 	判断key是否存在
	 * @param key	键
	 * @return	true 存在 false不存在
	 */
	public static boolean hasKey(String key) {
		return redisTemplate.hasKey(key);
	}
	/**
	 * 	删除缓存
	 * @param keys	可以传一个值 或多个
	 */
	@SuppressWarnings("unchecked")
	public static void del(String... keys) {
		if (keys != null && keys.length > 0) {
            if (keys.length == 1) {
                redisTemplate.delete(keys[0]);
            } else {
                redisTemplate.delete(CollectionUtils.arrayToList(keys));
            }
        }
	}
	/**
	 * 	普通缓存获取
	 * @param key	键
	 * @return
	 */
	public static Object get(String key) {
		return key == null ? null : redisTemplate.opsForValue().get(key);
	}
	/**
	 *	 普通缓存放入
	 * @param key	键
	 * @param value	值
	 */
	public static void set(String key, Object value) {
		redisTemplate.opsForValue().set(key, value);
	}
	/**
	 * 	普通缓存放入并设置时间
	 * @param key	键
	 * @param value	值
	 * @param time	时间(秒) time要大于0 如果time小于等于0 将设置无限期
	 */
	public static void set(String key, Object value, long time) {
		if (time > 0) {
            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
        } else {
            set(key, value);
        }
	}
	/**
	 * 普通缓存放入并设置时间
	 * @param key	键
	 * @param value	值
	 * @param time	time要大于0 如果time小于等于0 将设置无限期
	 * @param unit	时间单位
	 */
	public static void set(String key, Object value, long time,TimeUnit unit) {
		if (time > 0) {
            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
        } else {
            set(key, value);
        }
	}
	/**
	 * 放入Map
	 * @param key	存放的Key
	 * @param map	存放的Map值
	 */
	public static void putALL(String key,Map<? extends Object, ? extends Object> map) {
		redisTemplate.opsForHash().putAll(key, map);
	}
	/**
	 * 设置超时时间
	 * @param key	存放的Key	
	 * @param map	存放的Map值
	 * @param time	超时时间，time要大于0 如果time小于等于0 将设置无限期
	 * @param unit	时间单位
	 */
	public static void putALL(String key,Map<? extends Object, ? extends Object> map,long time,TimeUnit unit) {
		redisTemplate.opsForHash().putAll(key, map);
		if (time > 0) { 
			redisTemplate.expire(key, time,unit);
		}
	}
	
	public static Map<Object, Object> entries(String key) {
		return redisTemplate.opsForHash().entries(key);
	}
}
